const arr = [1, [2, 3], [4, [5, 6]], [[7, 8], 9], [10, [11, [12, 13]]]];
// 1. 使用flat方法
function flatten(arr) {
  return arr.flat(Infinity)
}
// 2. 使用递归
function flatten(arr) {
  const res =[];
  arr.forEach(item => {
    if(Array.isArray(item)) {
      res.push(...flatten(item))
    } else {
      res.push(item)
    }
  })
  return res;
}
// 3. 使用reduce方法
function flatten(arr) {
  return arr.reduce((pre, curr)=> {
    return pre.concat(Array.isArray(curr) ? flatten(curr) : curr)
  },[])
}

// 6. some() + concat() + 栈
function flatten(arr) {
  let res = [...arr];
  while(res.some(Array.isArray)) {
    res = [].concat(...res)
  }
  return res;
}

// 7. 使用some() + concat() + 递归
function flatten(arr) {
  const res = [].concat(...arr);
  return res.some(Array.isArray) ? flatten(res) : res;
}

// 4. 使用栈方法
function flatten(arr) {
  const stack = [...arr];
  const result = [];
  
  while (stack.length > 0) {
      const next = stack.pop();
      if (Array.isArray(next)) {
          stack.push(...next);
      } else {
          result.push(next);
      }
  }
  
  return result.reverse();
}
// 5. 使用队列（广度优先）
function flatten(arr) {
  const queue = [...arr];
  const result = [];
  while(queue.length > 0) {
    const next = queue.shift();
    if(Array.isArray(next)) {
      queue.unshift(...next)
    } else {
      result.push(next)
    }
  }
  return result;
}



console.log(flatten(arr))